package tp.disenio.client;

import java.util.ArrayList;
import tp.disenio.client.CompetenciaDTO;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.VerticalPanel;

//CU-003

public class ListarCompetenciasDeportivasUNA extends Composite {
	
	private Button btnHome;
	private Button btnBuscar;
	private Button btnLogin;
	private FlexTable flexTable;
	private ScrollPanel scrollPanelCompetencias;
	private TextBox txtBxUserLogin;
	private PasswordTextBox txtBxPassLogin;
	private TextBox txtBxCompetencia;
	private ListBox listBxDeporte;
	private ListBox listBxModalidad;
	private ListBox listBxEstadodecompetencia;
	private ArrayList<String> listadoBotonDeLupa = new ArrayList<String>();
	private ArrayList<CompetenciaDTO> listadoCompetencias = new ArrayList<CompetenciaDTO>();
	final RootPanel rootPanel;
	
	public ListarCompetenciasDeportivasUNA(){

		final LoginServiceAsync loginService = GWT.create(LoginService.class);
		
		rootPanel = RootPanel.get("nameFieldContainer");
		
		AbsolutePanel absolutePanel = new AbsolutePanel();
		initWidget(absolutePanel);
		absolutePanel.setSize("1024px", "480px");
		
				
		// WIDGETS
			
		btnLogin = new Button("Login");
		absolutePanel.add(btnLogin, 885, 65);
		btnLogin.setSize("50", "10");
		
		txtBxUserLogin = new TextBox();
		absolutePanel.add(txtBxUserLogin, 745, 55);
		txtBxUserLogin.setSize("120px", "10px");
		
		txtBxPassLogin = new PasswordTextBox();
		absolutePanel.add(txtBxPassLogin, 745, 80);
		txtBxPassLogin.setSize("120px", "10px");
		
		txtBxCompetencia = new TextBox();
		absolutePanel.add(txtBxCompetencia, 329, 150);
		txtBxCompetencia.setSize("159px", "10px");
				
		btnBuscar = new Button("Buscar");
		absolutePanel.add(btnBuscar, 247, 222);
		btnBuscar.setSize("70", "30");
		
		btnHome = new Button("Home");
		absolutePanel.add(btnHome, 75,85);
		btnHome.setSize("50px", "30px");
		
		scrollPanelCompetencias = new ScrollPanel();
		absolutePanel.add(scrollPanelCompetencias, 155, 290);
		scrollPanelCompetencias.setSize("700px", "200px");
		
		flexTable = new FlexTable();
		scrollPanelCompetencias.setWidget(flexTable);
		flexTable.setSize("100%", "100%");
		
		listBxEstadodecompetencia = new ListBox();
		absolutePanel.add(listBxEstadodecompetencia, 595, 185);
		listBxEstadodecompetencia.setSize("169px", "22px");
		
		listBxModalidad = new ListBox();
		absolutePanel.add(listBxModalidad, 595, 152);
		listBxModalidad.setSize("169px", "22px");
		
		listBxDeporte = new ListBox();
		absolutePanel.add(listBxDeporte, 329, 189);
		listBxDeporte.setSize("169px", "22px");
			
		// LABELS
		
		Label labelNombre = new Label("Nombre");
		labelNombre.setStyleName("camposTabla");
		labelNombre.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelNombre,200,260);
		
		Label labelDeporte = new Label("Deporte");
		labelDeporte.setStyleName("camposTabla");
		labelDeporte.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelDeporte,330,260);
		
		Label labelModalidad = new Label("Modalidad");
		labelModalidad.setStyleName("camposTabla");
		labelModalidad.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelModalidad,430,260);
		
		Label labelEstadodecompetencia = new Label("Estado");
		labelEstadodecompetencia.setStyleName("camposTabla");
		labelEstadodecompetencia.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelEstadodecompetencia,550,260);
		
		Label labelUsuario = new Label("Usuario");
		labelUsuario.setStyleName("camposTabla");
		labelUsuario.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelUsuario,660,260);
		
		Label labelVerCompetenciaSeleccionada = new Label("Ver");
		labelVerCompetenciaSeleccionada.setStyleName("camposTabla");
		labelVerCompetenciaSeleccionada.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelVerCompetenciaSeleccionada,800,260);
		
		Label labelUserLogin = new Label("Usuario");
		labelUserLogin.setStyleName("usuarioLabel");
		absolutePanel.add(labelUserLogin,675,55);
					
		Label labelPasswordLogin = new Label("Pass");
		labelPasswordLogin.setStyleName("usuarioLabel");
		absolutePanel.add(labelPasswordLogin,675,80);
		
		Label labelBusqueda = new Label("Busqueda");
		labelBusqueda.setStyleName("subTitulo");
		absolutePanel.add(labelBusqueda, 350, 105);
		labelBusqueda.setSize("81px", "24px");
		
		Label labelCompetencia = new Label("Competencia");
		labelCompetencia.setStyleName("label");
		absolutePanel.add(labelCompetencia, 225, 150);
		labelCompetencia.setSize("76px", "18px");
		
		Label labelDeporteLBox = new Label("Deporte");
		labelDeporteLBox.setStyleName("label");
		absolutePanel.add(labelDeporteLBox, 226, 185);
		labelDeporteLBox.setSize("45px", "18px");
			
		Label labelModalidadLBox = new Label("Modalidad");
		labelModalidadLBox.setStyleName("label");
		absolutePanel.add(labelModalidadLBox, 513, 152);
		labelModalidadLBox.setSize("59px", "18px");
		
		Label labelEstadodecompetenciaLBox = new Label("Estado");
		labelEstadodecompetenciaLBox.setStyleName("label");
		absolutePanel.add(labelEstadodecompetenciaLBox, 513, 185);
		labelEstadodecompetenciaLBox.setSize("41px", "18px");
		
	
		//Limpiando listboxs
		getListBxDeporte().clear();getListBxModalidad().clear();getListBxEstadodecompetencia().clear();
		
		// Inicializando listboxs
		agregarCamposListBox("listbxDeporte");
		agregarCamposListBox("listbxModalidad");
		agregarCamposListBox("listbxEstadodecompetencia");
		
		
		// HANDLERS
				
		getBtnLogin().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				
				final LoginServiceAsync loginService = GWT.create(LoginService.class);
				final DialogBox dialogBox = new DialogBox();
				final Button dialogBoxButton = new Button("Ok");
				final Label textToServerLabel = new Label();
				final HTML serverResponseLabel = new HTML();
				
				// Handler boton de dialogBox
				dialogBoxButton.addClickHandler(new ClickHandler() {
					public void onClick(ClickEvent event) {
						dialogBox.hide();
					}
				});
				 
				 AsyncCallback<String> callback = new AsyncCallback<String>() {
					 
					     public void onFailure(Throwable caught) {
					    	
					    	 	dialogBox.setText("Auslober");
								dialogBox.setAnimationEnabled(true);
								VerticalPanel dialogVPanel = new VerticalPanel();
								dialogVPanel.addStyleName("dialogVPanel");
								dialogVPanel.add(new HTML("<b>Respuesta del servidor:</b>"));
								dialogVPanel.add(textToServerLabel);
								dialogVPanel.add(new HTML("<br>"+(String)caught.getMessage()));
								dialogVPanel.add(serverResponseLabel);
								dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
								dialogVPanel.add(dialogBoxButton);
								dialogBox.setWidget(dialogVPanel);
								dialogVPanel.setSize("250px", "100px");
								dialogBox.setPopupPosition(535,225);
								dialogBox.show();
								dialogBoxButton.setFocus(true);
					    }

						@Override
						public void onSuccess(String result) {
												
//							setVisibilidad(false);
							rootPanel.remove(rootPanel.getWidget(1));
							rootPanel.add(new HomeUA(getTxtBxUserLogin().getText()),100,50);
							dialogBox.setText("Auslober");
							dialogBox.setAnimationEnabled(true);
							VerticalPanel dialogVPanel = new VerticalPanel();
							dialogVPanel.addStyleName("dialogVPanel");
							dialogVPanel.add(new HTML("<b>Respuesta del servidor:</b>"));
							dialogVPanel.add(textToServerLabel);
							dialogVPanel.add(new HTML("<br>"+result));
							dialogVPanel.add(serverResponseLabel);
							dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
							dialogVPanel.add(dialogBoxButton);
							dialogBox.setWidget(dialogVPanel);
							dialogVPanel.setSize("250px", "100px");
							dialogBox.setPopupPosition(535,225);
							dialogBox.show();
							dialogBoxButton.setFocus(true);
							 
							
						}
					  };
					  
				loginService.loginServer(getTxtBxUserLogin().getText(),getTxtBxPassLogin().getText(),callback);
		
				
			}
		});
		
		
		getBtnHome().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				
//				setVisibilidad(false);
				rootPanel.remove(rootPanel.getWidget(1));
				rootPanel.add(new Ingreso(),(Window.getClientWidth()/3),150);
				
			}
		});
		
		getBtnBuscar().addClickHandler(new ClickHandler() {
			
			
			final ListarCompetenciasServiceAsync listarCompetencias = GWT.create(ListarCompetenciasService.class);
			
			@Override
			public void onClick(ClickEvent event) {
							
				AsyncCallback<ArrayList<CompetenciaDTO>> callback = new AsyncCallback<ArrayList<CompetenciaDTO>>(){
					
					@Override
					public void onSuccess(ArrayList<CompetenciaDTO> result) {
						

							 flexTable.removeAllRows();
							 if(!getListadoCompetencias().isEmpty()){
   							 getListadoCompetencias().clear();
							 }
							 getListadoBotonDeLupa().clear();
							 
							 setListadoCompetencias(result);
						     CargarCompetencias(getFlexTable());
						 
						}
					
					@Override
					public void onFailure(Throwable caught) {
									
							Window.alert("Ha ocurrido un error");
						}
						
				};
				
				
				try
				{
						validarCampos();
						listarCompetencias.listarCompetencias("@.com", getTxtBxCompetencia().getText(), getListBxDeporte().getItemText(getListBxDeporte().getSelectedIndex()), getListBxModalidad().getItemText(getListBxModalidad().getSelectedIndex()), getListBxEstadodecompetencia().getItemText(getListBxEstadodecompetencia().getSelectedIndex()), callback);
					
				}
				catch (IllegalArgumentException mensaje) {
					
					Window.alert(mensaje.getMessage());
				}
				
				
			}
		});
		
		getTxtBxUserLogin().addKeyPressHandler(new KeyPressHandler() {
			
			@Override
			public void onKeyPress(KeyPressEvent event) {
			
				if(event.getUnicodeCharCode()==13){
					getBtnLogin().click();
					
				}
			
			}
		});
		
		getTxtBxPassLogin().addKeyPressHandler(new KeyPressHandler() {
			
			@Override
			public void onKeyPress(KeyPressEvent event) {
			
				if(event.getUnicodeCharCode()==13){
					getBtnLogin().click();
					
				}
			
			}
		});
		
		// TAB INDEX
		
		getBtnHome().setTabIndex(1);
		getTxtBxCompetencia().setTabIndex(2);
		getListBxModalidad().setTabIndex(3);
		getListBxDeporte().setTabIndex(4);
		getListBxEstadodecompetencia().setTabIndex(5);
		getBtnBuscar().setTabIndex(6);
		getScrollPanelCompetencias().getElement().setTabIndex(7);
		getTxtBxUserLogin().setTabIndex(8);
		getTxtBxPassLogin().setTabIndex(9);
		getBtnLogin().setTabIndex(10);
		
		
	}
	
	public boolean validarCampos() throws IllegalArgumentException{
		
		if(getTxtBxCompetencia().getText().equals("") 
				&& getListBxDeporte().getItemText(getListBxDeporte().getSelectedIndex()).equals("")
				&& getListBxEstadodecompetencia().getItemText(getListBxEstadodecompetencia().getSelectedIndex()).equals("")  
				&& getListBxModalidad().getItemText(getListBxModalidad().getSelectedIndex()).equals("")){
			
			throw new IllegalArgumentException("Debe ingresar al menos un campo");
			
		}	
		
		
		return true;
				
	}
	
	public ListBox getListBxDeporte() {
		return listBxDeporte;
	}

	public ListBox getListBxModalidad() {
		return listBxModalidad;
	}

	public ListBox getListBxEstadodecompetencia() {
		return listBxEstadodecompetencia;
	}
	
	public TextBox getTxtBxCompetencia() {
		return txtBxCompetencia;
	}
	
	public FlexTable getFlexTable() {
		return flexTable;
	}

	public Button getBtnHome() {
		return btnHome;
	}

	public Button getBtnBuscar() {
		return btnBuscar;
	}

	public Button getBtnLogin() {
		return btnLogin;
	}

	public TextBox getTxtBxUserLogin() {
		return txtBxUserLogin;
	}

	public PasswordTextBox getTxtBxPassLogin() {
		return txtBxPassLogin;
	}
	
	public void CargarCompetencias(FlexTable flexTable){
			
		flexTable.setStyleName("FlexTable");
		
			for(int i=0; i<getListadoCompetencias().size(); i++){
				
				flexTable.setText(i, 0,getListadoCompetencias().get(i).getNombre());
				flexTable.setText(i, 1,getListadoCompetencias().get(i).getDeporte());
				flexTable.setText(i, 2,getListadoCompetencias().get(i).getModalidad());
				flexTable.setText(i, 3,getListadoCompetencias().get(i).getEstadodecompetencia());
				flexTable.setText(i, 4,getListadoCompetencias().get(i).getUsuario());
				
				flexTable.getRowFormatter().addStyleName(i, "FlexTable");				
				flexTable.getColumnFormatter().setWidth(0, "30px");
				flexTable.getColumnFormatter().setWidth(1, "60px");
				flexTable.getColumnFormatter().setWidth(2, "40px");
				flexTable.getColumnFormatter().setWidth(3, "30px");
				flexTable.getColumnFormatter().setWidth(4, "60px");
				flexTable.getColumnFormatter().setWidth(5, "30px");

				
				Image imagenVerCompetenciaBtn = new Image("images/lupa.jpg");
				
				imagenVerCompetenciaBtn.setSize("35px", "30px");
				imagenVerCompetenciaBtn.setTitle("Ver competencia");
				
				flexTable.setWidget(i, 5, imagenVerCompetenciaBtn);

		
								
				final String symbol = i+"1";
				listadoBotonDeLupa.add(symbol);
				
		
				imagenVerCompetenciaBtn.addClickHandler(new ClickHandler() {
					
					@Override
					public void onClick(ClickEvent event) {
											
//						setVisibilidad(false);
						    
						int fila = getListadoBotonDeLupa().indexOf(symbol);
						getListadoBotonDeLupa().remove(symbol);
						
						rootPanel.remove(rootPanel.getWidget(1));
						getRootPanel().add(new VerCompetenciaUNA(getListadoCompetencias().get(fila)),100,50);
						
					}
				});
			
				
			}
		
			
									
		
			
			
			
			
		}
	
	public void setVisibilidad(boolean estado){
		this.setVisible(estado);
	}
	

	public void cargarCamposListbox(ListBox listbox,ArrayList<String> campos){
		
		for(int i=0;i<campos.size();i++){
			
			listbox.addItem(campos.get(i));
			
		}
		
	}
	
	public void agregarCamposListBox(String listboxNombre){
		
		final CamposListboxServiceAsync cargarCamposListbox = GWT.create(CamposListboxService.class);
		final String lbxNombre = listboxNombre;
	
		AsyncCallback<ArrayList<String>> callback = new AsyncCallback<ArrayList<String>>(){
			
			@Override
			public void onSuccess(ArrayList<String> result) {
					  
				   cargarCamposListbox(getListbx(lbxNombre),result);
				 
				}
			
			@Override
			public void onFailure(Throwable caught) {
								
					Window.alert("Ha ocurrido un error");
				}
				
		};
		
	   cargarCamposListbox.camposListbox(listboxNombre, callback);
		
	}
	

	/**
	 * @return the listadoCompetencias
	 */
	public ArrayList<CompetenciaDTO> getListadoCompetencias() {
		return listadoCompetencias;
	}

	/**
	 * @param listadoCompetencias the listadoCompetencias to set
	 */
	public void setListadoCompetencias(ArrayList<CompetenciaDTO> listadoCompetencias) {
		this.listadoCompetencias = listadoCompetencias;
	}
	
	private ListBox getListbx(String listboxNombre){
		
		ListBox retorno;
			
		if(listboxNombre.equals("listbxDeporte")){
			
			retorno = getListBxDeporte();
		}
		
		else if(listboxNombre.equals("listbxModalidad")){
			
			retorno = getListBxModalidad();
		}
				
		else if(listboxNombre.equals("listbxEstadodecompetencia")){
			
			retorno = getListBxEstadodecompetencia();
		}
	
		else{
			retorno = new ListBox();
		}
		
		return retorno;
	}
	
	/**
	 * @return the listadoBotonDeLupa
	 */
	public ArrayList<String> getListadoBotonDeLupa() {
		return listadoBotonDeLupa;
	}

	/**
	 * @param listadoBotonDeLupa the listadoBotonDeLupa to set
	 */
	public void setListadoBotonDeLupa(ArrayList<String> listadoBotonDeLupa) {
		this.listadoBotonDeLupa = listadoBotonDeLupa;
	}
	


	/**
	 * @return the rootPanel
	 */
	public RootPanel getRootPanel() {
		return rootPanel;
	}
	
	public ScrollPanel getScrollPanelCompetencias() {
		return scrollPanelCompetencias;
	}



}

